package cn.edu.xjtu.work.NumArray;

/**
 * 303. 区域和检索 - 数组不可变
 * 
 * 给定一个整数数组  nums，求出数组从索引 i 到 j（i ≤ j）范围内元素的总和，包含 i、j 两点。
 * 
 * 实现 NumArray 类：
 * 
 * NumArray(int[] nums) 使用数组 nums 初始化对象 int sumRange(int i, int j) 返回数组 nums
 * 从索引 i 到 j（i ≤ j）范围内元素的总和，包含 i、j 两点（也就是 sum(nums[i], nums[i + 1], ... ,
 * nums[j])）
 */
public class NumArray {
  int[] sum;

  public static void main(String[] args) {
    NumArray numArray = new NumArray(new int[] { -2, 0, 3, -5, 2, -1 });
    System.out.println(numArray.sumRange(0, 2)); // return 1 ((-2) + 0 + 3)
    System.out.println(numArray.sumRange(2, 5)); // return -1 (3 + (-5) + 2 + (-1))
    System.out.println(numArray.sumRange(0, 5)); // return -3 ((-2) + 0 + 3 + (-5) + 2 + (-1))
  }

  public NumArray(int[] nums) {
    sum = new int[nums.length + 1];
    int ret = 0;
    for (int i = 0; i < nums.length; i++) {
      ret += nums[i];
      sum[i + 1] = ret;
    }
  }

  public int sumRange(int left, int right) {
    return sum[right + 1] - sum[left];
  }
}
